﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using EntidadesDeNegocio;
using Utiles;

namespace ObliDisenoAplicaciones.Interfaz
{
    public partial class AgregarModificarDiseno : Form
    {
        private Diseno disenoActual;
        private bool inicie;

        public AgregarModificarDiseno(Diseno diseno)
        {
            InitializeComponent();
            disenoActual=diseno;
            inicie = false;
            this.cmbMedio.DataSource = Enum.GetValues(typeof(MedioComponente));
            this.cmbMedio.SelectedIndex = -1;
            inicie = true;
            CargarDatosDiseno();
            
        }

        private void CargarGrilla()
        {
            this.dGVCompDelDiseno.AutoGenerateColumns = false;
            this.dGVCompDelDiseno.Rows.Clear();
            int row=0;
            foreach (Componente comp in disenoActual.ListaComponentes)
            {
                if (!ExisteComponenteEnGrilla(comp)) {
                    dGVCompDelDiseno.Rows.Add();
                    dGVCompDelDiseno.Rows[row].Cells["Componente"].Value = comp.Modelo;
                    dGVCompDelDiseno.Rows[row].Cells["Cantidad"].Value = comp.Cantidad ;
                    row = row + 1;
                }                
            }
            this.dGVCompDelDiseno.Refresh();
        }

        private bool ExisteComponenteEnGrilla(Componente comp)
        {
            String modelo = comp.Modelo;
            foreach (DataGridViewRow row in dGVCompDelDiseno.Rows)
            {
                if (row.Cells["Componente"].Value.ToString().Equals(modelo))
                {
                    return true;
                }
            }
            return false;
        }

        private void CargarDatosDiseno()
        {
            if (disenoActual != null)
            {
                CargarGrilla();
                txtNombreDiseno.Text = disenoActual.Nombre;
                txtCosto.Text = disenoActual.Costo.ToString();
                txtCostoAgregado.Text = disenoActual.CostoAgregado.ToString();                
                txtNombreDiseno.Enabled = false;
                switch (disenoActual.Medio)
                {
                    case MedioComponente.Acuatico:
                        this.cmbMedio.SelectedItem = MedioComponente.Acuatico;
                        break;
                    case MedioComponente.Terrestre:
                        this.cmbMedio.SelectedItem = MedioComponente.Terrestre;
                        break;
                    case MedioComponente.Aereo:
                        this.cmbMedio.SelectedItem = MedioComponente.Aereo;
                        break;
                    default:
                        break;
                }
                cmbMedio.Enabled = false;
            }           
        }


        private void CargarListaComponentesHabilitados()
        {
            lstCompPosibles.Items.Clear();
            foreach (Componente comp in Stock.Instancia.ListaComponentes)
            {
                if (comp.Medio == (MedioComponente)cmbMedio.SelectedItem)
                {
                    //Solo cargo los componentes diferentes para que sea mas facil elegirlos.
                    if (!lstCompPosibles.Items.Contains(comp))
                    {
                        if (disenoActual == null)
                        {
                            lstCompPosibles.Items.Add(comp);
                        }
                        else 
                        {
                            // No agrego los componentes que ya tiene el diseno que estoy modificando
                            if (!disenoActual.ListaComponentes.Contains(comp))
                            {
                                lstCompPosibles.Items.Add(comp);
                            }
                        }
                        
                    }
                }
            }            
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }

        private void cmbMedio_SelectedIndexChanged(object sender, EventArgs e)
        {
            if(inicie)
                CargarListaComponentesHabilitados();
        }

        private void btnAgregarComp_Click(object sender, EventArgs e)
        {
            if (lstCompPosibles.SelectedItem != null)
            {                
                dGVCompDelDiseno.Rows.Add();
                dGVCompDelDiseno.Rows[dGVCompDelDiseno.Rows.Count - 1].Cells["Componente"].Value = ((Componente)lstCompPosibles.SelectedItem).Modelo;
                dGVCompDelDiseno.Rows[dGVCompDelDiseno.Rows.Count-1].Cells["Cantidad"].Value = 1;
                lstCompPosibles.Items.Remove(lstCompPosibles.SelectedItem);
                ActualizarCosto();                
            }
        }

        private void btnRemoveComp_Click(object sender, EventArgs e)
        {
            if (dGVCompDelDiseno.SelectedRows != null)
            {
                Componente comp = Stock.Instancia.ObtenerComponente(dGVCompDelDiseno.CurrentRow.Cells["Componente"].Value.ToString());
                dGVCompDelDiseno.Rows.Remove(dGVCompDelDiseno.CurrentRow);
                lstCompPosibles.Items.Add(comp);
                ActualizarCosto();
            }
        }
        private void btnGuardarComp_Click(object sender, EventArgs e)
        {
            bool disenoNuevo = disenoActual == null;

            if (ValidarCampos())
            {
                List<Componente> componentes = new List<Componente>();
                foreach (DataGridViewRow row in dGVCompDelDiseno.Rows)
                {
                    Componente compEnStock = Stock.Instancia.ObtenerComponente(row.Cells["Componente"].Value.ToString());
                    int cantidad = Convert.ToInt32(row.Cells["Cantidad"].Value);
                    Componente nuevo = compEnStock.Clone();
                    nuevo.Cantidad = cantidad;
                    componentes.Add(nuevo);
                }
                if (disenoNuevo)
                {
                    Sistema.Instancia.AgregarDiseno(txtNombreDiseno.Text, (MedioComponente)cmbMedio.SelectedItem, decimal.Parse(txtCostoAgregado.Text), componentes);
                }
                else
                {
                    Sistema.Instancia.ModificarDiseno(txtNombreDiseno.Text, decimal.Parse(txtCostoAgregado.Text),componentes);
                }                
            }
        }

        private void ActualizarCosto()
        {
            decimal costo = decimal.Parse(txtCostoAgregado.Text);
            if (dGVCompDelDiseno.RowCount != 0)
            {               
                foreach (DataGridViewRow row in dGVCompDelDiseno.Rows) 
                {

                    Componente comp = Stock.Instancia.ObtenerComponente(row.Cells["Componente"].Value.ToString());
                    int cant = Convert.ToInt32(row.Cells["Cantidad"].Value.ToString());
                    costo = costo + (comp.Costo*cant);
                }
                
            }
            txtCosto.Text = costo.ToString();
        }


        private bool ValidarCampos()
        {
            if (txtNombreDiseno.Text == string.Empty || txtNombreDiseno.Text == null)
            {
                MessageBox.Show("Campo Nombre vacio, debe ingresar un nombre", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            if (txtCosto.Text == string.Empty || txtCosto.Text == null)
            {
                MessageBox.Show("Campo Costo vacio", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            if (txtCostoAgregado.Text == string.Empty || txtCostoAgregado.Text == null)
            {
                MessageBox.Show("Campo Costo Agrgado vacio, debe ingresar un costo", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            if (cmbMedio.SelectedValue == null)
            {
                MessageBox.Show("Campo Medio vacio, debe ingresar un medio", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            if (!ValidarGrilla())
            {                
                return false;
            }

            return true;
        }

        private bool ValidarGrilla()
        {
            if (dGVCompDelDiseno.RowCount == 0)
            {
                MessageBox.Show("El diseño debe contener almenos 1 componente", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            else
            {
                foreach (DataGridViewRow row in dGVCompDelDiseno.Rows)
                {
                    if (!EsNumerico(row.Cells["Cantidad"].Value.ToString()))
                    {
                        MessageBox.Show("La cantidade de los componentes debe ser de valor numerico", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return false;
                    }
                    else
                    {
                        int valor = Convert.ToInt32(row.Cells["Cantidad"].Value.ToString());
                        if (valor < 1)
                        {
                            MessageBox.Show("La cantidad de los componentes debe mayor a 0", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            return false;
                        }
                    }

                }
            }
            return true;
        }

        private bool EsNumerico (string text)
        {
            int Result = 0;
            bool retorno = false;
            if (int.TryParse(text, out Result))
            {
                retorno = true;
            }
            return retorno;
        }

        private void txtCostoAgregado_TextChanged(object sender, EventArgs e)
        {
            if (txtCostoAgregado.Text == string.Empty || txtCostoAgregado.Text == null)
            {
                MessageBox.Show("Campo Costo Agrgado vacio, debe ingresar un costo", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

            }
            else 
            {
                ActualizarCosto();
            }
            
        }

        private void dGVCompDelDiseno_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            ActualizarCosto();
        }

        private void btnSalir_Click_1(object sender, EventArgs e)
        {
            this.Dispose();
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }
    }
}
